package com.xuantu.learn.core.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

/**
 * 动态代理类
 * <p>
 * 		1，静态代理通常只代理一个类，动态代理是代理一个接口下的多个实现类。
 * 		2，静态代理事先知道要代理的是什么，而动态代理不知道要代理什么东西，只有在运行时才知道。
 * 		3，动态代理是实现 JDK 里的 InvocationHandler 接口的 invoke 方法，但注意的是代理的是接口，也就是你的
			业务类必须要实现接口，通过 Proxy 里的 newProxyInstance 得到代理对象。
 * </p>
 * @author fengzp
 *
 */
public class ArrayListProxy {
	
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		final ArrayList<String> list = new ArrayList<>();
		
		List<String> proxyInstance = (List<String>)Proxy.newProxyInstance(list.getClass().getClassLoader(), 
				list.getClass().getInterfaces(), new InvocationHandler() {
					
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						return method.invoke(list, args);
					}
				});
		proxyInstance.add("Hello");
		proxyInstance.add("World");
		
		System.out.println(proxyInstance);
		System.out.println(list);
	}

}
